package cn.soft863.common.util;

import java.util.Arrays;

import org.apache.commons.codec.digest.DigestUtils;

/**
 * 加密算法工具类
 * 
 * 破解:32位的随机数,只使用其中的3个.
 * 换成128个,再使用其中的3个.
 * 
 * 文件加密的思路?????
 * 32位,128位,不就是字符数组的长度吗?
 * 32个长度,只使用其中的一部分??
 * 哪一部分???你不知道吧
 * 
 * @author 902-B-Book
 *
 */
public class EncryptUtil
{
	/**
	 * 加密字符串
	 * 
	 * 加密后的字符串:加密算法$随机字母$加密算法(明文+随机字母)
	 * 举例		  sha256$abcdefg$sha256(111111abcdefg)
	 * @return
	 */
	public String encodeStr(String souPass) 
	{
		/* 随机字符串 */
		String randStr = VerifyCodeUtil.generateVerifyCode(32);
		System.out.println("=====encodeStr========" + randStr);
		/* 拼装加密前的字符串
		 * 加密算法(明文+随机字母)
		 *  */
		String qianStr = randStr + souPass ; 
		/* 加密后的字符串 */
		String houStr = DigestUtils.sha256Hex(qianStr);
		
		/* 拼装最终的字符串 */
		String finiStr = "sha256$" + randStr + "$" + houStr;
		return finiStr ; 
	}
	
	/**
	 * 验证字符串
	 * 
	 * 拿着密文重新进行加密,随机字母,
	 * 只比较密文
	 * 
	 * @param souPass 原始字符串
	 * @param encodePass	加密字符串
	 * @return
	 */
	public boolean verifyPass(String souPass,String encodePass)
	{
		System.out.println("====verifyPass======");
		/* 将密文按照$拆分
		 * split:正则表达式,
		 * $:以什么什么开头,$原样拆分
		 *  */
		String[] strs = encodePass.split("\\$");
		System.out.println(Arrays.toString(strs));
		if(strs.length != 3)
		{
			return false ; 
		}
		
		/* 随机字符串 */
		String randStr = strs[1];
		/* 拼装加密前的字符串
		 * 加密算法(明文+随机字母)
		 *  */
		String qianStr = randStr + souPass ; 
		/* 加密后的字符串 */
		String houStr = DigestUtils.sha256Hex(qianStr);
		
		/* 拼装最终的字符串 */
		String finiStr = "sha256$" + randStr + "$" + houStr;
		return finiStr.equalsIgnoreCase(encodePass) ;
	}
	
	public static void main(String[] args)
	{
		String souPass = "111111" ; 
		/* md5 */
		System.out.println("md5:" + DigestUtils.md5Hex(souPass));
		System.out.println("sha256:" + DigestUtils.sha256Hex(souPass));
		System.out.println("sha512:" + DigestUtils.sha512Hex(souPass));
		
		EncryptUtil encryptUtil = new EncryptUtil() ; 
		String result = encryptUtil.encodeStr(souPass);
		System.out.println("==encodeStr====" + result);
		
		boolean flag = encryptUtil.verifyPass(souPass, result);
		System.out.println("===verifyPass===" + flag);
	}
}
